﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Sauces.Bussinees.Entities.Caja;
using Sauces.Bussinees.Entities.Almacen;
using Sauces.Bussinees.Logic.Service;
using Sauces.Bussinees.Logic.Caja.Service;
using Microsoft.Practices.Unity;
using System.Web.ModelBinding;

namespace Sauces.Web.Caja
{
    public partial class FrmBoleta : System.Web.UI.Page
    {
        private const string KeyBoleta = "boleta";

        [Dependency]
        public IClienteService clienteService { set; get; }

        [Dependency]
        public IProductoService productoService { set; get; }

        [Dependency]
        public IBoletaService   boletaService { set; get; }

        protected void Page_Load(object sender, EventArgs e)
        {
            var opc = Request.QueryString["opc"];
            var IdBoleta = Request.QueryString["id"];   

            if (!Page.IsPostBack)
            {
                if (opc != null && opc == "new")
                {
                    var nuevaBoleta = new Boleta()
                    {

                        Fecha = DateTime.Now,
                        
                    };

                    BindingBoleta(nuevaBoleta);
                    ViewState["opc"] = opc;
                }

                else if (opc != null && opc == "detalle" && IdBoleta != null)
                {
                    var boleta = boletaService.getFromBoletaById(Int32.Parse(IdBoleta.ToString()));
                    btnGuardar.Visible = false;
                    txtDni.Enabled = false;
                    btnBuscarCliente.Visible = false;

                    lvProducto.Visible = false;
                    upProductos.Visible = false;
                    BindingBoleta(boleta);                    
                    ViewState["opc"] = opc;
                }
            }
        }

        private void BindingBoleta(Boleta nuevaBoleta)
        {
            Cache.Insert(KeyBoleta, nuevaBoleta);

            txtId.Text = nuevaBoleta.Id.ToString();            
            txtFecha.Text = nuevaBoleta.Fecha.ToShortDateString();
           

            if (nuevaBoleta.Cliente != null)
            {
                txtDni.Text = nuevaBoleta.Cliente.Dni.ToString();
                txtNombres.Text = nuevaBoleta.Cliente.NombresCompletos.ToString();
                txtDireccion.Text = nuevaBoleta.Cliente.Direccion.ToString();
            }

            nuevaBoleta.Total = nuevaBoleta.DetalleBoleta.Sum(dp => dp.Monto);


            Cache.Insert(KeyBoleta, nuevaBoleta);

            lvDetalleBoleta.DataSource = nuevaBoleta.DetalleBoleta;
            lvDetalleBoleta.DataBind();

            var lblTotal = lvDetalleBoleta.FindControl("lblTotal") as Label;


            if (lblTotal != null)
            {
                lblTotal.Text = nuevaBoleta.Total.ToString();                
            }
        }

        protected void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            var dni = txtDni.Text;

            var cliente = clienteService.getFromClienteByDni(dni);

            var boleta = Cache.Get(KeyBoleta) as Boleta;

            if (cliente == null)
            {
                lblMsgCliente.Text = "El cliente no existe !!!";
                txtDni.Text = "";
                txtNombres.Text = "";
                txtDireccion.Text = "";

                boleta.Cliente = null;
            }
            else
            {
                boleta.IdCliente = cliente.Id;
                boleta.Cliente = cliente;

                Cache.Insert(KeyBoleta, boleta);

                txtDni.Text = cliente.Dni;
                txtNombres.Text = cliente.NombresCompletos;
                txtDireccion.Text = cliente.Direccion;
                lblMsgCliente.Text = "";
            }
        }

        protected void lvProducto_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());

                var boleta = GetBoleta();

                var existe = boleta.DetalleBoleta.Where(dp => dp.IdProducto == productoId).SingleOrDefault();
                if (existe != null)
                {
                    existe.Cantidad += 1;
                }

                else
                {
                    var producto = productoService.getFromProductoById(productoId);

                    var newDetalle = new DetalleBoleta()
                    {
                        IdBoleta = boleta.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        Precio = producto.PVenta,
                        Cantidad = 1

                    };


                    boleta.DetalleBoleta.Add(newDetalle);
                }

                BindingBoleta(boleta);
            }
        }

        private Boleta GetBoleta()
        {
            return Cache.Get(KeyBoleta) as Boleta;
        }

        public IEnumerable<Producto> GetProductos([Control("txtNombre")]string criterio)
        {

            return productoService.getAllProductoByNombre(criterio);
        }

        protected void lvDetalleFactura_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                var boleta = GetBoleta();

                var detalle = boleta.DetalleBoleta.Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    boleta.DetalleBoleta.Remove(detalle);

                BindingBoleta(boleta);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var boleta = GetBoleta();

                foreach (var row in lvDetalleBoleta.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    boleta.DetalleBoleta.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    boleta.DetalleBoleta.ToList()[row.DisplayIndex].Precio = decimal.Parse(txtPrecio.Text);
                }

                BindingBoleta(boleta);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var boleta = GetBoleta();
            boleta.Fecha = DateTime.Parse(txtFecha.Text);


            if (boleta != null)
            {
                if (ViewState["opc"].ToString() == "new")
                {
                    boletaService.addBoleta(boleta);
                    Response.Redirect("FrmListaBoleta.aspx");
                }

                else if (ViewState["opc"].ToString() == "detalle")
                {
                    //boletaService.upDateBoleta(boleta);
                    btnGuardar.Visible = false;
                    //Response.Redirect("FrmListaBoleta.aspx");
                }
            }
        }       
    }
}